﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Common
{

public struct KeyGrantRight
{
    public string sUSerID, sObjectID;
    public void setValues(string a, string b )
    {
        sUSerID = a;
        sObjectID = b;
    }
}

public struct StuctPermissions
{
    public bool bAdd, bUpdate, bDelete, bRead;
}
public partial class Admin : Form
{
    #region Variable Area
    SqlConnection conn;
    CommonDO cmDo = new CommonDO();

    DataTable tbUsers, tbGroups, tbUser2Group, tbGrantRights, tbObject;

    string sRet = CommonHeader.NO_ERROR;

    string sUserIdOld = "";
    string sGroupIdOld = "";

    bool isFormloaded = false;

    KeyGrantRight grantRightOld = new KeyGrantRight();

    #endregion

#region Function Area
public Admin(SqlConnection con1)
{
    conn = con1;
    InitializeComponent();
    InitializeAll();
}

private void InitializeAll()
{
    cbbKindOfUser.SelectedIndex = 0;
    LoadUsers("");
    LoadGroups("");
    loadUser2Group(sGroupIdOld);
    loadObjects();
    LoadGrantRight("","");
    isFormloaded = true;
}

private void LoadUsers(string sUserID )
{

string cmd = "Select * from Users";
sRet = cmDo.getTable(conn, ref tbUsers, cmd);

if (sRet != CommonHeader.NO_ERROR)
{
    MessageBox.Show("Load data failed");
    return;
}

dtgUsers.DataSource = tbUsers;
cbbUsers.DataSource = tbUsers;
cbbUsers.DisplayMember = "Name";
cbbUsers.ValueMember = "UserID";

dtgUsers.Columns[2].Visible = false;
dtgUsers.Columns[1].Width = 400;

if (tbUsers.Rows.Count > 0)
{
    cbbUsers.SelectedIndex = 0;
    if (sUserID != "")
    {
        BindingUser2Controls(sUserID);
    }
    else
    {
        BindingUser2Controls(tbUsers.Rows[0]["UserID"].ToString());
    }
}


}

private void LoadGroups(string sGroupID)
{

    string cmd = "Select * from Groups";
    sRet = cmDo.getTable(conn, ref tbGroups, cmd);

    if (sRet != CommonHeader.NO_ERROR)
    {
        MessageBox.Show("Load data failed");
        return;
    }

    dtgGroups.DataSource = tbGroups;
    cbbGroup.DataSource = tbGroups;
    cbbGroup.DisplayMember = "GroupName";
    cbbGroup.ValueMember = "GroupID";

    if (tbGroups.Rows.Count > 0)
    {
        cbbGroup.SelectedIndex = 0;
        if (sGroupID != "")
        {
            BindingGroups2Controls(sGroupID);
        }
        else
        {
            BindingGroups2Controls(tbGroups.Rows[0]["GroupID"].ToString());
        }

    }
}

private void loadUser2Group(string sGroupID)
{
    string cmd = "Select * from User2Groups where GroupID = N'" + sGroupID + "'";
    sRet = cmDo.getTable(conn, ref tbUser2Group, cmd);

    if (sRet != CommonHeader.NO_ERROR)
    {
        MessageBox.Show("Load data failed");
        return;
    }

    dtgUser2Group.DataSource = tbUser2Group;
}

private void loadObjects()
{
    string cmd = "Select * from Objects";
    sRet = cmDo.getTable(conn, ref tbObject, cmd);

    if (sRet != CommonHeader.NO_ERROR)
    {
        MessageBox.Show("Load data failed");
        return;
    }

    cbbObject.DataSource = tbObject;
    cbbObject.DisplayMember = "ObjectName";
    cbbObject.ValueMember = "ObjectID";
}

private void LoadGrantRight(string sUserID, string sObjectID )
{
    // Kind = 0 : Group ; 1 : Users
    string cmd = "Select * from GrantRights where KindOfUser = N'"+ cbbKindOfUser.SelectedIndex.ToString() +"'";
    sRet = cmDo.getTable(conn, ref tbGrantRights, cmd);

    if (sRet != CommonHeader.NO_ERROR)
    {
        MessageBox.Show("Load data failed");
        return;
    }

    dtgGrantRights.DataSource = tbGrantRights;

    if (cbbKindOfUser.SelectedIndex == 1)
    {
        lblKindOfUser.Text = "Groups";
        cbbUserGroup.DataSource = tbGroups;
        cbbUserGroup.DisplayMember = "GroupName";
        cbbUserGroup.ValueMember = "GroupID";
    }
    else
    {
        lblKindOfUser.Text = "Users";
        cbbUserGroup.DataSource = tbUsers;
        cbbUserGroup.DisplayMember = "UserID";
        cbbUserGroup.ValueMember = "UserID";
    }
    
    if (tbGrantRights.Rows.Count > 0)
    {
        if ((sUserID == "") || (sObjectID == ""))
        {
            BindingGrantRight(  tbGrantRights.Rows[0]["UserID"].ToString(),
                                tbGrantRights.Rows[0]["ObjectID"].ToString());
        }
        else
        {
            BindingGrantRight(sUserID, sObjectID);
        }
    }


}

private void BindingUser2Controls(string sUserID)
{
for (int i = 0; i < tbUsers.Rows.Count; i++)
{
    if (sUserID == tbUsers.Rows[ i ]["UserID"].ToString())
    {
        txtUserID.Text = tbUsers.Rows[i]["UserID"].ToString();
        txtUserName.Text = tbUsers.Rows[i]["Name"].ToString();
        txtPassword.Text = tbUsers.Rows[i]["Password"].ToString();
        txtConfirmPass.Text = tbUsers.Rows[i]["Password"].ToString();

        if (tbUsers.Rows[i]["Locked"].ToString() == "1" )
        {
            chkLockUser.Checked = true;
        }
        else
        {
            chkLockUser.Checked = false;
        }

        sUserIdOld = txtUserID.Text;
        dtgUsers.CurrentCell = dtgUsers.Rows[i].Cells[0];
        break;
    }
}
}

private void BindingGroups2Controls(string sGroupID)
{
for (int i = 0; i < tbGroups.Rows.Count; i++)
{
    if (sGroupID == tbGroups.Rows[i]["GroupID"].ToString())
    {
        txtGroupID.Text = tbGroups.Rows[i]["GroupID"].ToString();
        txtGroupName.Text = tbGroups.Rows[i]["GroupName"].ToString();

        sGroupIdOld = txtGroupID.Text;
        dtgGroups.CurrentCell = dtgGroups.Rows[i].Cells[0];
        break;
    }
}
}

private void BindingGrantRight(string sUserID, string sObjectID)
{
    for (int i = 0; i < tbGrantRights.Rows.Count; i++)
    {
        if ( (sUserID == tbGrantRights.Rows[i]["UserID"].ToString())
            && (sObjectID == tbGrantRights.Rows[i]["ObjectID"].ToString()))
        {
            cbbUserGroup.SelectedValue =  sUserID;
            cbbObject.SelectedValue = sObjectID;
            grantRightOld.sUSerID = sUserID;
            grantRightOld.setValues(sUserID, sObjectID);

            if (tbGrantRights.Rows[i]["AddRight"].ToString() == "1")
            {
                chkAdd.Checked = true;
            }
            else
            {
                chkAdd.Checked = false;
            }

            if (tbGrantRights.Rows[i]["UpdateRight"].ToString() == "1")
            {
                chkUpdate.Checked = true;
            }
            else
            {
                chkUpdate.Checked = false;
            }

            if (tbGrantRights.Rows[i]["DeleteRight"].ToString() == "1")
            {
                chkDelete.Checked = true;
            }
            else
            {
                chkDelete.Checked = false;
            }

            if (tbGrantRights.Rows[i]["ReadRight"].ToString() == "1")
            {
                chkRead.Checked = true;
            }
            else
            {
                chkRead.Checked = false;
            }

            dtgGrantRights.CurrentCell = dtgGrantRights.Rows[i].Cells[0];
            btnUpdateRights.Enabled = true;
            return;
        }

        btnUpdateRights.Enabled = false;
    }
}
#endregion

private void dtgUsers_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0)
    {
        BindingUser2Controls(tbUsers.Rows[e.RowIndex]["UserID"].ToString());
    }
}

private void btnAddUser_Click(object sender, EventArgs e)
{
    if (txtUserID.Text == "")
    {
        MessageBox.Show("User ID không được để trống");
        txtUserID.Focus();
        return;
    }

    if (txtUserName.Text == "")
    {
        MessageBox.Show("Username không được để trống");
        txtUserName.Focus();
        return;
    }

    if (txtPassword.Text == "")
    {
        MessageBox.Show("password không được để trống");
        txtPassword.Focus();
        return;
    }

    if (txtPassword.Text != txtConfirmPass.Text)
    {
        MessageBox.Show("Password không giống nhau, vui lòng nhập lại");
        txtPassword.Focus();
        return;
    }

    string sLockTemp = "0";
    if (chkLockUser.Checked)
    {
        sLockTemp = "1";
    }

    string cmd = "Users_add N'" + txtUserID.Text + "',"
                + " N'" + txtUserName.Text + "',"
                + " N'" + txtPassword.Text + "',"
                + " N'" + sLockTemp + "'";

    sRet = cmDo.ExcecuteQuery(conn, cmd);
    if (sRet != CommonHeader.NO_ERROR)
    {
        if (sRet.Contains("PK_Users"))
        {
            MessageBox.Show("User này đã được đăng ký");
        }
        else
        {
            MessageBox.Show("Add data không thành công");
        }
        return;
    }

    LoadUsers(txtUserID.Text);
}

private void btnUpdate_Click(object sender, EventArgs e)
        {
            if (txtUserID.Text == "")
            {
                MessageBox.Show("User ID không được để trống");
                txtUserID.Focus();
                return;
            }

            if (txtUserName.Text == "")
            {
                MessageBox.Show("Username không được để trống");
                txtUserName.Focus();
                return;
            }

            if (txtPassword.Text == "")
            {
                MessageBox.Show("password không được để trống");
                txtPassword.Focus();
                return;
            }

            if (txtPassword.Text != txtConfirmPass.Text)
            {
                MessageBox.Show("Password không giống nhau, vui lòng nhập lại");
                txtPassword.Focus();
                return;
            }

            string sLockTemp = "0";
            if (chkLockUser.Checked)
            {
                sLockTemp = "1";
            }

            string cmd = "Users_update N'" + txtUserID.Text + "',"
                        + " N'" + txtUserName.Text + "',"
                        + " N'" + txtPassword.Text + "',"
                        + " N'" + sLockTemp + "',"
                        + " N'" + sUserIdOld + "'";

            sRet = cmDo.ExcecuteQuery(conn, cmd);
            if (sRet != CommonHeader.NO_ERROR)
            {
                if (sRet.Contains("PK_Users"))
                {
                    MessageBox.Show("User này đã được đăng ký");
                }
                else
                {
                    MessageBox.Show("Update data không thành công");
                }
                return;
            }

            LoadUsers(txtUserID.Text);
        }

private void btnDelUser_Click(object sender, EventArgs e)
{
    if (dtgUsers.CurrentCell.RowIndex >= 0)
    {
        if (MessageBox.Show("Bạn muốn xóa User này?", "Confirm", 
                MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            string sUserIdOldTemp
                = tbUsers.Rows[dtgUsers.CurrentCell.RowIndex]["UserID"].ToString();
            string cmd = "Users_delete N'" + sUserIdOldTemp + "'";

            sRet = cmDo.ExcecuteQuery(conn, cmd);
            if (sRet != CommonHeader.NO_ERROR)
            {               
                MessageBox.Show("Delete data không thành công");
                return;
            }
            LoadUsers("");
        }
    }
}

private void dtgGroups_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0)
    {
        BindingGroups2Controls(tbGroups.Rows[e.RowIndex]["GroupID"].ToString());
    }
}

private void btnAddGroup_Click(object sender, EventArgs e)
{
    if (txtGroupID.Text == "")
    {
        MessageBox.Show("Group ID không được để trống");
        txtGroupID.Focus();
        return;
    }

    if (txtGroupName.Text == "")
    {
        MessageBox.Show("Group name không được để trống");
        txtGroupName.Focus();
        return;
    }

    string cmd = "Groups_add N'" + txtGroupID.Text + "',"
                + " N'" + txtGroupName.Text + "'";

    sRet = cmDo.ExcecuteQuery(conn, cmd);
    if (sRet != CommonHeader.NO_ERROR)
    {
        if (sRet.Contains("PK_Groups"))
        {
            MessageBox.Show("Group này đã được đăng ký");
        }
        else
        {
            MessageBox.Show("Add data không thành công");
        }
        return;
    }

    LoadGroups(txtGroupID.Text);
}

private void btnUpdateGroup_Click(object sender, EventArgs e)
{
    if (txtGroupID.Text == "")
    {
        MessageBox.Show("Group ID không được để trống");
        txtGroupID.Focus();
        return;
    }

    if (txtGroupName.Text == "")
    {
        MessageBox.Show("Group name không được để trống");
        txtGroupName.Focus();
        return;
    }

    string cmd = "Groups_update N'" + txtGroupID.Text + "',"
                + " N'" + txtGroupName.Text + "', "
                + " N'" + sGroupIdOld + "'";

    sRet = cmDo.ExcecuteQuery(conn, cmd);
    if (sRet != CommonHeader.NO_ERROR)
    {
        if (sRet.Contains("PK_Groups"))
        {
            MessageBox.Show("Group này đã được đăng ký");
        }
        else
        {
            MessageBox.Show("Update data không thành công");
        }
        return;
    }

    LoadGroups(txtGroupID.Text);
}

private void btnDelGroup_Click(object sender, EventArgs e)
{
    if (dtgGroups.CurrentCell.RowIndex >= 0)
    {
        if (MessageBox.Show("Bạn muốn xóa User này?","Confirm",
                MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            string SGroupIDTemp
                = tbGroups.Rows[dtgGroups.CurrentCell.RowIndex]["GroupID"].ToString();
            string cmd = "Groups_delete N'" + SGroupIDTemp + "'";

            sRet = cmDo.ExcecuteQuery(conn, cmd);
            if (sRet != CommonHeader.NO_ERROR)
            {
                if (sRet.Contains("FK_"))
                {
                    MessageBox.Show("Dữ liệu này đang được sử dụng nên không xóa được");
                }
                else
                {
                    MessageBox.Show("Delete data không thành công");
                }
                return;
            }
            LoadGroups("");
        }
    }
}

private void cbbGroup_SelectedIndexChanged(object sender, EventArgs e)
{
    if (isFormloaded)
    {
        loadUser2Group(cbbGroup.SelectedValue.ToString());
    }
}

private void btnAddUser2Group_Click(object sender, EventArgs e)
{
    string cmd = "User2Groups_add N'" + cbbGroup.SelectedValue.ToString() + "',"
                + " N'" + cbbUsers.SelectedValue.ToString() + "'";
    sRet = cmDo.ExcecuteQuery(conn, cmd);
    if (sRet != CommonHeader.NO_ERROR)
    {
        if (sRet.Contains("PK_User2Groups"))
        {
            MessageBox.Show("Data này đã được đăng ký");
        }
        else
        {
            MessageBox.Show("Add data không thành công");
        }
        return;
    }
    loadUser2Group(cbbGroup.SelectedValue.ToString());
}

private void btnDelUserOutGroup_Click(object sender, EventArgs e)
{
    if (dtgUsers.CurrentCell.RowIndex >= 0)
    {
        if (MessageBox.Show("Bạn muốn xóa User này?", "Confirm",
                MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            string sUserIdOldTemp
                = tbUser2Group.Rows[dtgUsers.CurrentCell.RowIndex]["UserID"].ToString();
            string cmd = "User2Groups_delete N'" + cbbGroup.SelectedValue.ToString() + "',"
                        + " N'"+ sUserIdOldTemp +"'";

            sRet = cmDo.ExcecuteQuery(conn, cmd);
            if (sRet != CommonHeader.NO_ERROR)
            {
                MessageBox.Show("Delete data không thành công");
                return;
            }
            loadUser2Group(cbbGroup.SelectedValue.ToString());
        }
    }
}

private void btnGrant_Click(object sender, EventArgs e)
{
    if (cbbUserGroup.Text == "")
    {
        MessageBox.Show("Chọn loại User");
        txtUserID.Focus();
        return;
    }
    string sKind = "0";
    if ( cbbUserGroup.SelectedIndex == 1 )
    {
        sKind = "1";
    }

    string sReadRight = "0";
    if (chkRead.Checked)
    {
        sReadRight = "1";
    }
    string sAddRight = "0";
    if (chkAdd.Checked)
    {
        sAddRight = "1";
    }

    string sUpdateRight = "0";
    if (chkUpdate.Checked)
    {
        sUpdateRight = "1";
    }

    string sDelRight = "0";
    if (chkDelete.Checked)
    {
        sDelRight = "1";
    }

    string cmd = "GrantRights_add N'" + cbbObject.SelectedValue.ToString() + "',"
                + " N'" + cbbUserGroup.SelectedValue.ToString() + "',"
                + " N'" + sKind + "',"
                + " N'" + sAddRight + "',"
                + " N'" + sUpdateRight + "',"
                + " N'" + sDelRight + "',"
                + " N'" + sReadRight + "'";

    sRet = cmDo.ExcecuteQuery(conn, cmd);
    if (sRet != CommonHeader.NO_ERROR)
    {
        if (sRet.Contains("PK_GrantRights"))
        {
            MessageBox.Show("data này đã được đăng ký");
        }
        else
        {
            MessageBox.Show("Add data không thành công");
        }
        return;
    }
    LoadGrantRight(cbbUserGroup.SelectedValue.ToString(),
                        cbbObject.SelectedValue.ToString());

}

private void dtgGrantRights_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0)
    {
        BindingGrantRight(tbGrantRights.Rows[e.RowIndex]["UserID"].ToString(),
            tbGrantRights.Rows[e.RowIndex]["ObjectID"].ToString());

    }
}

private void cbbKindOfUser_SelectedIndexChanged(object sender, EventArgs e)
{
    if (isFormloaded)
    {
        LoadGrantRight("", "");
    }
}



}
}
